package com.wenhai.liuyubobobo.imooc.sort;

/**
 * 希尔排序
 *
 * @author wenhai
 * @date   2021/3/15
 */
public class ShellSort {
    private ShellSort() {

    }

    public static <E extends Comparable<E>> void sort(E[] data) {
        int h = data.length >>> 1;
        while (h >= 1) {
            for (int start = 0; start < h; start++) {
                for (int i = start + h; i < data.length; i += h) {
                    E t = data[i];
                    int j;
                    for (j = i; j - h >= 0 && t.compareTo(data[j - h]) < 0; j -= h) {
                        data[j] = data[j - h];
                    }
                    data[j] = t;
                }
            }
            h = h >>> 1;
        }
    }
    public static <E extends Comparable<E>> void sort2(E[] data) {
        int h = data.length >>> 1;
        while (h >= 1) {
            for (int i = h; i < data.length; i++) {
                E t = data[i];
                int j;
                for (j = i; j - h >= 0 && t.compareTo(data[j - h]) < 0; j -= h) {
                    data[j] = data[j - h];
                }
                data[j] = t;
            }
            h = h >>> 1;
        }
    }
    public static <E extends Comparable<E>> void sort3(E[] data) {
        int h = data.length - 1;
        while (h > data.length) {
            h = 3 * h + 1;
        }
        while (h >= 1) {
            for (int i = h; i < data.length; i ++) {
                E t = data[i];
                int j;
                for (j = i; j - h >= 0 && t.compareTo(data[j - h]) < 0; j -= h) {
                    data[j] = data[j - h];
                }
                data[j] = t;
            }
            h = h / 3;
        }
    }
}
